// Copyright Epic Games, Inc. All Rights Reserved.

#pragma once

#include "CoreMinimal.h"

#include "LyraPenetrationAvoidanceFeeler.generated.h"

/**
 * 定义用于相机穿透避免的触须射线的结构体。
 */
USTRUCT()
struct FLyraPenetrationAvoidanceFeeler
{
	GENERATED_BODY()

	/** 描述与主射线偏差的FRotator */
	UPROPERTY(EditAnywhere, Category=PenetrationAvoidanceFeeler)
	FRotator AdjustmentRot; // 调整旋转

	/** 如果此触须击中世界，它对最终位置的影响程度 */
	UPROPERTY(EditAnywhere, Category=PenetrationAvoidanceFeeler)
	float WorldWeight; // 世界权重

	/** 如果此触须击中APawn，它对最终位置的影响程度（设置为0将完全不尝试与Pawn碰撞） */
	UPROPERTY(EditAnywhere, Category=PenetrationAvoidanceFeeler)
	float PawnWeight; // Pawn权重

	/** 追踪此触须时用于碰撞的范围 */
	UPROPERTY(EditAnywhere, Category=PenetrationAvoidanceFeeler)
	float Extent; // 范围

	/** 如果上一帧没有命中任何东西，此触须追踪之间的最小帧间隔 */
	UPROPERTY(EditAnywhere, Category=PenetrationAvoidanceFeeler)
	int32 TraceInterval; // 追踪间隔

	/** 自上次使用此触须以来的帧数 */
	UPROPERTY(transient)
	int32 FramesUntilNextTrace; // 下一帧追踪前的帧数

	/**
	 * 默认构造函数
	 */
	FLyraPenetrationAvoidanceFeeler()
		: AdjustmentRot(ForceInit) // 强制初始化调整旋转
		, WorldWeight(0) // 世界权重初始化为0
		, PawnWeight(0) // Pawn权重初始化为0
		, Extent(0) // 范围初始化为0
		, TraceInterval(0) // 追踪间隔初始化为0
		, FramesUntilNextTrace(0) // 下一帧追踪前的帧数初始化为0
	{
	}

	/**
	 * 参数化构造函数
	 * @param InAdjustmentRot 调整旋转
	 * @param InWorldWeight 世界权重
	 * @param InPawnWeight Pawn权重
	 * @param InExtent 范围
	 * @param InTraceInterval 追踪间隔
	 * @param InFramesUntilNextTrace 下一帧追踪前的帧数
	 */
	FLyraPenetrationAvoidanceFeeler(const FRotator& InAdjustmentRot,
									const float& InWorldWeight, 
									const float& InPawnWeight, 
									const float& InExtent, 
									const int32& InTraceInterval = 0, 
									const int32& InFramesUntilNextTrace = 0)
		: AdjustmentRot(InAdjustmentRot) // 设置调整旋转
		, WorldWeight(InWorldWeight) // 设置世界权重
		, PawnWeight(InPawnWeight) // 设置Pawn权重
		, Extent(InExtent) // 设置范围
		, TraceInterval(InTraceInterval) // 设置追踪间隔
		, FramesUntilNextTrace(InFramesUntilNextTrace) // 设置下一帧追踪前的帧数
	{
	}
};